<!DOCTYPE html>
<html lang="en">

<head>
  <title>Erlang眼中的世界</title>
  <meta charset="UTF-8">
  <meta name="description" content="ltoddy's blog">
  <meta name="author" content="liutao">
  <meta name="author" content="ltoddy">
  <meta name="author" content="just for fun">

  <link rel="stylesheet" href="../../static/css/bootstrap.css">
  <link rel="stylesheet" href="../../static/css/bootstrap-theme.css">
  <link rel="icon" href="../../static/me.jpg">

  <script src="../../static/js/jquery-3.2.1.min.js"></script>
  <script src="../../static/js/bootstrap.js"></script>
</head>

<body>
<a href="https://github.com/ltoddy/ltoddy.github.io" target="_blank"><img
    style="position: absolute; top: 0; right: 0; border: 0;"
    src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67"
    alt="Fork me on GitHub"
    data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png">
</a>
<div class="container">
  <div class="page-header">
    <h3>Erlang眼中的世界</h3>
  </div>
  <h4>这个世界是并行的</h4>
  <p> 如果希望将程序的行为设计得与真实世界物体的行为相一致,那么程序就应该具有并发结构</p>
  <h3>在Erlang中,变量一旦被赋值就不能再改变的特性还可以简化测试</h3>
  <p>在代码错误中的排查中相当一种常见的错误就是,变量被赋了一个错误的值.在这种情况下,你需要找出程序中从哪获得的错误值. 如果变量在程序的不同地方多次修改了值,那么要找出哪些修改是错误的是非常困难的.
  </p>
  <h4>抛弃"副作用"意味着我们的程序可以并行化</h4>
  <p>用术语来说,我们把可修改的内存区域称为可变状态.Erlang是一个函数式语言,不存在可变状态.</p>
  <p>用C,Java这样传统编程语言为多核CPU编写程序,就不得不应付共享内存带来的问题,要想不破坏共享内存,就必须在访问时对其加锁,程序还要保证在操纵共享内存时不会崩溃.</p>
  <p>而Erlang没有可变状态,也就没有共享内存,更没有锁,这一切都有利于并行化程序的编写.</p>
  <p>shell打印一串列表时,只有列表中的所有整数都是可打印字符,它才把这个列表当作字符串来处理.</p>
  <p>不需要死记硬背哪一个整数对应特定的ASCII字符,可以使用$符号来表示字符的整数值.</p>
  <pre><code>4> I = $s.
115
5> [I-32, $u, $p].
"Sup"
</code></pre>


  <table border="1">
    <thead>
    <tr>
      <th>模式匹配</th>
    </tr>
    <tr>
      <td>模式</td>
      <td>值</td>
      <td>结果</td>
    </tr>
    </thead>
    <tbody>
    <tr>
      <td>{X, abc}</td>
      <td>{123, abc}</td>
      <td>成功, X |-> 123</td>
    </tr>
    <tr>
      <td>{X, Y, Z}</td>
      <td>{222, def, "cat"}</td>
      <td>成功, X |-> 222, Y |-> def, Z |-> "cat"</td>
    </tr>
    <tr>
      <td>{X, Y}</td>
      <td>{333, ghi, "cat"}</td>
      <td>失败,元祖结构不同</td>
    </tr>
    <tr>
      <td>X</td>
      <td>true</td>
      <td>成功, X |-> true</td>
    </tr>
    <tr>
      <td>{X, Y, Z}</td>
      <td>{{abc, 12}, 42, {abc, 12}</td>
      <td>成功,X |-> {abc, 12}, Y |-> 42, Z |-> {abc, 12}</td>
    </tr>
    <tr>
      <td>{X, Y, X}</td>
      <td>{{abc, 12}, 42, true}</td>
      <td>失败,X不能同时为{abc, 12}和true</td>
    </tr>
    <tr>
      <td>[H | T]</td>
      <td>[1, 2, 3, 4, 5]</td>
      <td>成功, H |-> 1, T |-> [2, 3, 4, 5]</td>
    </tr>
    <tr>
      <td>[H | T]</td>
      <td>"cat"</td>
      <td>成功, H |-> 99, T |-> "at"</td>
    </tr>
    <tr>
      <td>{A, B, C | T}</td>
      <td>{a, b, c, d, e, f}</td>
      <td>成功,A |-> a, B |-> b, C |-> c, T |-> [d, e, f]</td>
    </tr>
    </tbody>
  </table>
  <pre><code>1> {X, abc} = {123, abc}.
{123,abc}
2> X.
123
3> f().
ok
4> {X, Y, Z} = {222, def, "cat"}.
{222,def,"cat"}
5> X.
222
6> Y.
def
7> Z.
"cat"
</code></pre>
  <p>命令f()会让shell释放它所绑定的变量.执行这个命令后,所有的变量都变成自由变量.</p>
  <h4>函数的编写方式</h4>
  <ul>
    <li>当调用函数的时候,对其调用参数的匹配过程从第一个子句开始依次向下进行.</li>
    <li>函数不能处理模式匹配失败的情形,此时程序会失败并抛出一个运行错误.这一点是故意为之.</li>
  </ul>
  <h4>在哪里使用分号</h4>
  <p>在Erlang中会遇到3种标点符号.</p>
  <ul>
    <li>逗号(,)用来分隔函数调用、数据构造器以及模式中的参数</li>
    <li>句号(.)(后跟一个空白符号)用来在shell中分隔完整的函数和表达式</li>
    <li>
      <h5>分号(;)用来分隔子句,在这几种情况都会用到子句.</h5>
      <pre><code>
            Pattern1 ->
                Expression1;
            Pattern2 ->
                Expression2;
            ...
        </code></pre>
    </li>
  </ul>
</div>
</body>

</html>
